val input = TextIO.openIn("input.txt");

fun printInt (a:int) =
    print(Int.toString(a)^" ");

fun getInt () =
    Option.valOf (TextIO.scanStream (Int.scan StringCvt.DEC) input);
    
fun printIntList ( [] ) = ()
  | printIntList ( x::xs ) = 
    let
	val tmp = printInt(x)
    in
	printIntList(xs)
    end;

fun getIntList ( 0 ) = []
  | getIntList ( N:int) = getInt()::getIntList(N-1);

 
(*** Begin ***)
(* zip : string list * int list -> (string * int) list *)
(* zip: string list * int list -> (string * int) list *)
fun zip ([], _) = []                                   (* 当第一个列表为空时，返回空列表 *)
  | zip (_, []) = []                                   (* 当第二个列表为空时，返回空列表 *)
  | zip (xs, ys) =                                     (* 当两个列表都非空时 *)
    let
      val minLen = Int.min (length xs, length ys)       (* 取两个列表长度的最小值作为结果列表的长度 *)
      fun zipHelper ([], _, _) = []                     (* 辅助函数：当列表为空时，返回空列表 *)
        | zipHelper (_, [], _) = []                     (* 辅助函数：当列表为空时，返回空列表 *)
        | zipHelper (x::xs, y::ys, n) =                 (* 辅助函数：处理当前元素 *)
          if n = 0 then []                              (* 如果计数器为0，表示处理完了minLen个元素，返回空列表作为结束条件 *)
          else (x, y) :: zipHelper(xs, ys, n-1)         (* 否则将当前元素(x, y)添加到结果列表中，递归处理下一个元素，计数器n减1 *)
    in
      zipHelper (xs, ys, minLen)                        (* 调用辅助函数进行实际处理 *)
    end;

(* unzip: (string * int) list -> string list * int list *)
fun unzip [] = ([], [])                                 (* 当输入列表为空时，返回两个空列表 *)
  | unzip ((x, y)::pairs) =                             (* 当输入列表非空时 *)
    let
      val (xs, ys) = unzip pairs                        (* 递归调用unzip处理剩余元素列表pairs，并将结果分别绑定到xs和ys *)
    in
      (x::xs, y::ys)                                    (* 使用x::xs构造一个新的字符串列表，y::ys构造一个新的整数列表，并作为结果返回 *)
    end;
  
(*** End ***)

[("a",1), ("b",2)] = zip(["a","b"],[1,2]);
print (Bool.toString it ^ "\n");
[("a",1)]=zip(["a"],[1,2,3]);
print (Bool.toString it ^ "\n");
[("a",1), ("b",2)] = zip(["a","b","c","d"],[1,2]);
print (Bool.toString it ^ "\n");

(["a","b"],[1,2]) = unzip([("a",1), ("b",2)]);
print (Bool.toString it ^ "\n");
 (["dragon","llama","muffin"],[42,54,76]) = unzip([("dragon",42),("llama",54),("muffin",76)]);
print (Bool.toString it ^ "\n");